package com.lx.sync.provider.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lx.sync.api.dto.SyncDataDTO;
import com.lx.sync.provider.entity.SyncData;
import com.lx.sync.provider.mapper.SyncDataMapper;
import com.lx.sync.provider.service.SyncDataService;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;

@Service
public class SyncDataServiceImpl extends ServiceImpl<SyncDataMapper, SyncData> implements SyncDataService {

    @Override
    public IPage<SyncData> getSyncData(SyncDataDTO syncDataDTO) {
        // 如果是游标分页模式，直接返回空分页对象
        if (syncDataDTO.getPageMode() == 1) {
            List<SyncData> syncDataByCursor = this.getSyncDataByCursor(syncDataDTO);
            IPage page = new Page<>();
            page.setRecords(syncDataByCursor);
            return page;
        }

        // 构建查询条件
        LambdaQueryWrapper<SyncData> wrapper = new LambdaQueryWrapper<>();
        wrapper.gt(SyncData::getUpdateTime, syncDataDTO.getUpdateTime())
               .orderByAsc(SyncData::getUpdateTime)
               .orderByAsc(SyncData::getId);

        // 创建分页对象，设置当前页和每页大小
        Page<SyncData> page = new Page<>(syncDataDTO.getPageNum(), syncDataDTO.getPageSize());
        page.setSearchCount(syncDataDTO.getQueryCount());
        
        // 执行分页查询
        return baseMapper.selectPage(page, wrapper);
    }

    @Override
    public Long getMaxUpdateTime() {
        return baseMapper.getMaxUpdateTime();
    }

    @Override
    public List<SyncData> getSyncDataByCursor(SyncDataDTO syncDataDTO) {
        // 如果不是游标分页模式，返回空列表
        if (syncDataDTO.getPageMode() != 1) {
            return Collections.emptyList();
        }

        // 使用游标分页查询
        return baseMapper.selectByCursor(
            syncDataDTO.getUpdateTime(),
            syncDataDTO.getLastId(),
            syncDataDTO.getPageSize()
        );
    }
}
